﻿using System.Collections.Generic;
using System.Linq;
using Arquitetura.Architectural.BusinessLogic;
using Arquitetura.Architectural.Model;
using Arquitetura.DataLayer;
using Arquitetura.Model;
using Microsoft.Practices.Unity;

namespace Arquitetura.BusinessLogic
{
    internal class AlunoProcess : Process, IAlunoProcess
    {
        #region Atributo(s)
        private readonly IAlunoData m_alunoData;
        #endregion Atributo(s)

        #region Construtor(es)
        public AlunoProcess() : this(new AlunoData()) { }

        [InjectionConstructor]
        public AlunoProcess(IAlunoData alunoData)
        {
            m_alunoData = alunoData;
        }
        #endregion Construtor(es)

        #region Método(s)
        public Resultado<IList<Aluno>> Listar()
        {
            Resultado<IQueryable<Aluno>> resSelect = m_alunoData.Select(new string[] { "Mae" });

            if (resSelect.Sucesso)
                return new Resultado<IList<Aluno>>(resSelect.Retorno.ToList());
            else
                return new Resultado<IList<Aluno>>(resSelect);
        }

        public Resultado<IList<Aluno>> Listar(Aluno alunoFiltro)
        {
            Resultado<IQueryable<Aluno>> resSelect = m_alunoData.Select(new string[] { "Mae" });

            if (resSelect.Sucesso)
            {
                IQueryable<Aluno> query = resSelect.Retorno;
                if (!string.IsNullOrEmpty(alunoFiltro.Nome))
                {
                    query = query.Where(alu => alu.Nome.Contains(alunoFiltro.Nome));
                }

                if (!string.IsNullOrEmpty(alunoFiltro.Sobrenome))
                {
                    query = query.Where(alu => alu.Sobrenome.Contains(alunoFiltro.Sobrenome));
                }

                return new Resultado<IList<Aluno>>(query.ToList());
            }
            else
                return new Resultado<IList<Aluno>>(resSelect);
        }

        public Resultado<Aluno> Consultar(int IdAluno)
        {
            Resultado<IQueryable<Aluno>> resSelect = m_alunoData.Select();

            if (resSelect.Sucesso)
            {
                IQueryable<Aluno> query = resSelect.Retorno;
                return new Resultado<Aluno>(query.Where(alu => alu.Id == IdAluno).First());
            }
            else
                return new Resultado<Aluno>(resSelect);
        }

        public Resultado Inserir(Aluno aluno)
        {
            AlunoValidation validation = new AlunoValidation(aluno, AlunoOperation.Insert, m_alunoData);
            Resultado resultado = validation.Validar();

            if (resultado.Sucesso)
            {
                resultado = m_alunoData.InsertAluno(aluno);
            }

            return resultado;
        }

        public Resultado Alterar(Aluno aluno)
        {
            AlunoValidation validation = new AlunoValidation(aluno, AlunoOperation.Update, m_alunoData);
            Resultado resultado = validation.Validar();

            if (resultado.Sucesso)
            {
                resultado = m_alunoData.UpdateAluno(aluno);
            }

            return resultado;
        }

        public Resultado Excluir(Aluno aluno)
        {
            AlunoValidation validation = new AlunoValidation(aluno, AlunoOperation.Delete, m_alunoData);
            Resultado resultado = validation.Validar();
            if (resultado.Sucesso)
            {
                resultado = m_alunoData.DeleteAluno(aluno);
            }
            return resultado;
        }
        #endregion Método(s)
    }
}
